package com.yupi.loveplanneraiagent.tools;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 优化后的网页搜索工具：返回结构清晰、内容精简的搜索结果
 */
public class WebSearchTool {

    private static final String SEARCH_API_URL = "https://www.searchapi.io/api/v1/search";

    private final String apiKey;

    public WebSearchTool(String apiKey) {
        this.apiKey = apiKey;
    }

    @Tool(description = "Search for up-to-date information from Baidu Search Engine. Returns concise results with title, snippet, and URL.")
    public String searchWeb(
            @ToolParam(description = "Search query in Chinese or English") String query) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("q", query);
        paramMap.put("api_key", apiKey);
        paramMap.put("engine", "baidu");

        try {
            String response = HttpUtil.get(SEARCH_API_URL, paramMap);
            JSONObject jsonObject = JSONUtil.parseObj(response);
            JSONArray organicResults = jsonObject.getJSONArray("organic_results");
            if (organicResults == null || organicResults.isEmpty()) {
                return "## 📭 搜索结果\n未找到相关信息，请尝试使用其他关键词搜索。";
            }
            // 取前3条，避免信息过载
            int limit = Math.min(3, organicResults.size());
            List<String> formattedResults = new java.util.ArrayList<>();
            // 添加搜索结果标题
            formattedResults.add("## 📊 搜索结果\n");
            // 格式化每个结果并添加序号
            for (int i = 0; i < limit; i++) {
                JSONObject result = (JSONObject) organicResults.get(i);
                String formattedResult = "" + (i + 1) + ". " + formatResult(result);
                formattedResults.add(formattedResult);
            }
            if (formattedResults.size() <= 1) { // 只有标题，没有实际结果
                return "搜索成功，但未找到可用结果。";
            }
            // 添加搜索结果结束提示
            formattedResults.add("\n---\n*搜索结果已为您整理完毕，共 " + limit + " 条相关信息*\n");
            return String.join("\n", formattedResults);
        } catch (Exception e) {
            return "## ❌ 搜索失败\n抱歉，搜索过程中出现错误：" + e.getMessage() + "\n请稍后重试或检查网络连接。";
        }
    }

    /**
     * 清洗并格式化单条搜索结果
     */
    private String formatResult(JSONObject result) {
        String title = cleanText(result.getStr("title", "无标题"));
        String snippet = cleanText(result.getStr("snippet", "无摘要"));
        String link = result.getStr("link", "#");

        // 优化格式：更美观的结构化显示
        return String.format("### 🔍 %s\n📝 %s\n🔗 [点击访问](%s)\n", title, snippet, link);
    }

    /**
     * 清洗文本：移除 HTML 标签、多余空格等（百度结果常含 <em> 等标签）
     */
    private String cleanText(String text) {
        if (text == null) return "";
        // 移除 HTML 标签（简单处理）
        return text.replaceAll("<[^>]+>", "")
                .replaceAll("\\s+", " ") // 合并多个空白符
                .trim();
    }
}